﻿using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

using System.Security.Cryptography;
using System.Text;
using System.Collections.Generic;
using System.IO;

namespace TonyNet4V1
{
	/// <summary>
	/// CommonFunction 通用函数
	/// </summary>
	public class CommonFunction
	{
		#region 构造函数
		public CommonFunction()
		{

		}
		#endregion

		
		/// <summary>
		/// 在一个字符串中去除尾部指定的字符串，如果尾部有的话，没有就不用去除
		/// </summary>
		/// <![CDATA[2014-8-14 11:24:48]]>
		/// <param name="lstrExcept">需要去除的字符串</param>
		/// <param name="lstrString">待处理的字符串</param>
		/// <returns></returns>
		public static string ExceptString(string lstrExcept, string lstrString)
		{
			int lnExceptLen;
			int lnStringLen;
			string lstrReturn = "";
			string lstrTemp;

			lnExceptLen = lstrExcept.Length;		// 获得要去除字符串的长度
			lnStringLen = lstrString.Length;
			if ((lnExceptLen > 0) && (lnStringLen > 0))
			{
				lstrTemp = lstrString.Substring(lnStringLen - lnExceptLen);
				if (lstrTemp == lstrExcept)
				{
					lstrReturn = lstrString.Substring(0, lnStringLen - lnExceptLen);
				}
				else
				{
					lstrReturn = lstrString;
				}
			}
			else
			{
				lstrReturn = lstrString;
			}

			return lstrReturn;
		}

		public static string OutLinkFirstChar(string lstrLink)
		{
			//return lstrLink.Substring(1, lstrLink.Length - 1);
			int i;

			i = lstrLink.LastIndexOf("/");

			return lstrLink.Substring(i + 1);
		}

		/// <summary>
		/// <para>功能描述：	把绝对路径转换成虚拟路径</para>
		/// <para>输入参数：	string imagesurl1	绝对路径</para>
		/// <para>		string strRootDir	网站根目录路径</para>
		/// <para>返回值：	</para>
		/// <para>方法范围：	protected</para>
		/// <para>作者：	Tony Mucor</para>
		/// <para>日期：	2013-08-06</para>
		/// <para>备注：	</para>
		/// </summary>
		public static string urlconvertor(string imagesurl1, string strRootDir)
		{
			//string tmpRootDir = Server.MapPath(System.Web.HttpContext.Current.Request.ApplicationPath.ToString());//获取程序根目录
			string tmpRootDir = strRootDir;
			string imagesurl2 = imagesurl1.Replace(tmpRootDir, ""); //转换成相对路径
			imagesurl2 = imagesurl2.Replace(@"\", @"/");
			return imagesurl2;
		}

		/// <summary>
		/// <para>功能描述：	在一个字符串中查找指定的字符串，找到返回true，字符串是用“， ”分割的</para>
		/// <para>输入参数：	string str1		被查找的字符串</para>
		/// <para>		string strFind		要查找的字符串</para>
		/// <para>返回值：	</para>
		/// <para>方法范围：	protected</para>
		/// <para>作者：	Tony Mucor</para>
		/// <para>日期：	2013-08-08</para>
		/// <para>备注：	</para>
		/// </summary>
		public static Boolean FindString(string str1, string strFind)
		{
			//if (str1.IndexOf(strFind) > 0)
			//{
			//        return true;
			//}
			//else
			//{
			//        return false;
			//}
			Boolean bReturn;

			bReturn = false;
			string[] str = str1.Split(',');
			foreach (string strIn in str)
			{
				if (strIn.Trim() == strFind.Trim())
				{
					bReturn = true;
					break;
				}
			}

			return bReturn;
		}

		/// <summary>
		/// <para>功能描述：	获得有当前年月组成的字符串，类似201112</para>
		/// <para>输入参数：	</para>
		/// <para>返回值：	</para>
		/// <para>方法范围：	public</para>
		/// <para>作者：	Tony Mucor</para>
		/// <para>日期：	2013-08-09</para>
		/// <para>备注：	</para>
		/// </summary>
		public static string GetNowYearMonth()
		{
			DateTime dtNow;
			string strReturn;

			dtNow = DateTime.Now;
			strReturn = dtNow.Year.ToString() + dtNow.Month.ToString();

			return strReturn;
		}

		/// <summary>
		/// <para>功能描述：	获得一个以现在日期命名的文件夹名字，类似20111231</para>
		/// <para>输入参数：	</para>
		/// <para>返回值：	</para>
		/// <para>方法范围：	public</para>
		/// <para>作者：	Tony Mucor</para>
		/// <para>日期：	2013-08-09</para>
		/// <para>备注：	</para>
		/// </summary>
		public static string GetNowDate()
		{
			DateTime dtNow;
			string strReturn;

			dtNow = DateTime.Now;
			strReturn = dtNow.Year.ToString() + dtNow.Month.ToString() + dtNow.Day.ToString();

			return strReturn;
		}

		/// <summary>
		/// <para>功能描述：	获得当前时间的字符串，类似1549</para>
		/// <para>输入参数：	</para>
		/// <para>返回值：	</para>
		/// <para>方法范围：	private</para>
		/// <para>作者：	Tony Mucor</para>
		/// <para>日期：	2013-08-09</para>
		/// <para>备注：	</para>
		/// </summary>
		private static string GetNowTime()
		{
			DateTime dtNow;
			string strReturn;

			dtNow = DateTime.Now;
			strReturn = dtNow.Hour.ToString() + dtNow.Minute.ToString() + dtNow.Second.ToString();

			return strReturn;
		}

		/// <summary>
		/// <para>功能描述：	获得当前日期时间组成的字符串，类似201112311552</para>
		/// <para>输入参数：	</para>
		/// <para>返回值：	</para>
		/// <para>方法范围：	public</para>
		/// <para>作者：	Tony Mucor</para>
		/// <para>日期：	2013-08-09</para>
		/// <para>备注：	</para>
		/// </summary>
		public static string GetNowDateTime()
		{
			return GetNowDate() + GetNowTime();
		}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		//
		/// <summary>
		/// 获得一个日期的月份、日期字符串。
		/// <para>例如：2012-1-1，获得01-01</para>
		/// </summary>
		/// <param name="strData"></param>
		/// <returns></returns>
		public static string GetMonthDay(string strData)
		{
			string strReturn = "";
			int nMonth = 0;
			int nDay = 0;
			string strMonth = "";
			string strDay = "";

			try
			{
				DateTime dt = Convert.ToDateTime(strData);

				nMonth = dt.Month;
				nDay = dt.Day;
				if (nMonth < 10)
				{
					strMonth = "0" + nMonth.ToString();
				}
				else
				{
					strMonth = nMonth.ToString();
				}
				if (nDay < 10)
				{
					strDay = "0" + nDay.ToString();
				}
				else
				{
					strDay = nDay.ToString();
				}
				strReturn = strMonth + "-" + strDay;
			}
			catch (Exception ex)
			{
				ShowMessageAlert.ShowError("日期格式错");
				ShowMessageAlert.ShowError(ex.Message);
			}
			finally
			{
				
			}
			return strReturn;
		}
		////////////////////////////////////////////////////////////////////////////////////////////////////

		/// <summary>
		/// <para>功能描述：	获得一个字符串的MD5编码</para>
		/// <para>输入参数：	</para>
		/// <para>返回值：	</para>
		/// <para>方法范围：	public</para>
		/// <para>作者：	Tony Mucor</para>
		/// <para>日期：	2013-08-09</para>
		/// <para>备注：	</para>
		/// </summary>
		public static string GetMd5Hash(string input)
		{
			MD5 md5Hash;

			md5Hash = MD5.Create();

			// Convert the input string to a byte array and compute the hash.
			byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input));

			// Create a new Stringbuilder to collect the bytes
			// and create a string.
			StringBuilder sBuilder = new StringBuilder();

			// Loop through each byte of the hashed data 
			// and format each one as a hexadecimal string.
			for (int i = 0; i < data.Length; i++)
			{
				sBuilder.Append(data[i].ToString("x2"));
			}

			// Return the hexadecimal string.
			return sBuilder.ToString();
		}

		/// <summary>
		/// 如果文件名中包含中文字，进行转换以免出现乱码
		/// </summary>
		/**********************************************************************************************
		 ** 功能描述：	如果文件名中包含中文字，进行转换以免出现乱码
		 ** 输入参数：
		 ** 返回值：
		 ** 作者：	Tony Mucor
		 ** 日期：	2013-08-15
		 ** 修改：
		 ** 日期：
		 *********************************************************************************************/
		public static string UTF_FileName(string strFilename)
		{

			return HttpUtility.UrlEncode(strFilename, System.Text.Encoding.UTF8);

		}

		#region 获得指定路径下所有指定类型的文件， 如果扩展名为空，则是全部类型的文件
		/// <summary>
		/// 获得指定路径下所有指定类型的文件， 如果扩展名为空，则是全部类型的文件
		/// </summary>
		/*******************************************************************
		 * * 功    能：	获得指定路径下所有指定类型的文件， 如果扩展名为空，则是全部类型的文件
		 * * 参    数：	strPath		指定路径
		 * *		strExtension	指定的扩展名
		 * * 返 回 值：
		 * * 作    者： Tony Mucor
		 * * 创建日期： 2013-9-24 15:20:58
		 * *******************************************************************/
		public static List<string> GetFileByPathExtension(string strPath, string strExtension)
		{
			DirectoryInfo dirNow;		// 当前路径
			FileInfo[] arrFileSubFiles;		// 当前路径下的所有文件
			string strSearch;
			List<string> listFiles;

			listFiles = new List<string>();
			if (strExtension != "")
			{
				strSearch = "*." + strExtension;
			}
			else
			{
				strSearch = "*.*";
			}
			dirNow = new DirectoryInfo(strPath);
			arrFileSubFiles = dirNow.GetFiles(strSearch);

			if (arrFileSubFiles.Length > 0)
			{
				foreach(FileInfo file in arrFileSubFiles)
				{
					listFiles.Add(urlconvertor(file.FullName, strPath));
				}
			}

			GetNowDirectoryChildFiles(dirNow, ref listFiles, strSearch, strPath);

			return listFiles;
		}
		#endregion

		#region 获得当前路径下下级文件，并添加到总的List中
		/// <summary>
		/// 获得当前路径下下级文件，并添加到总的List中
		/// </summary>
		/*******************************************************************
		 * * 功    能：	获得当前路径下下级文件，并添加到总的List中
		 * * 参    数：	theDir		当前路径
		 * *		listFiles	总的文件List
		 * *		strSearch	要查找的文件过滤字符串
		 * *		strPath		要查找的文件最上层路径
		 * * 返 回 值：
		 * * 作    者： Tony Mucor
		 * * 创建日期： 2013-9-24 15:38:58
		 * *******************************************************************/
		private static void GetNowDirectoryChildFiles(DirectoryInfo theDir, ref List<string> listFiles, string strSearch, string strPath)
		{
			DirectoryInfo[] arrSubDir;		// 当前路径下所有文件夹

			arrSubDir = theDir.GetDirectories();
			if (arrSubDir.Length > 0)
			{
				foreach (DirectoryInfo subDir in arrSubDir)
				{
					FileInfo[] arrSubFiles;

					arrSubFiles = subDir.GetFiles(strSearch);
					if (arrSubFiles.Length > 0)
					{
						foreach (FileInfo file in arrSubFiles)
						{
							listFiles.Add(urlconvertor(file.FullName, strPath));
						}
					}

					GetNowDirectoryChildFiles(subDir, ref listFiles, strSearch, strPath);
				}
			}
		}
		#endregion

		////////////////////////////////////////////////////////////////////////////////////////////////////
		public static List<Structs.FileInfo> GetFoldersFiles(string strPath)
		{
			DirectoryInfo dirNow;
			FileInfo[] arrFileSubFiles;		// 当前路径下的所有文件
			DirectoryInfo[] arrFolders;		// 当前路径下所有文件夹
			//List<string> listFiles = new List<string>(); ;
			List<Structs.FileInfo> listFiles = new List<Structs.FileInfo>();

			dirNow = new DirectoryInfo(strPath);
			arrFileSubFiles = dirNow.GetFiles();
			arrFolders = dirNow.GetDirectories();

			if (arrFolders.Length > 0)
			{
				foreach (DirectoryInfo dir in arrFolders)
				{
					//listFiles.Add(urlconvertor(dir.FullName, strPath));
					listFiles.Add(new Structs.FileInfo(dir.Name, dir.FullName));
				}
			}

			if (arrFileSubFiles.Length > 0)
			{
				foreach (FileInfo file in arrFileSubFiles)
				{
					//listFiles.Add(urlconvertor(file.FullName, strPath));
					listFiles.Add(new Structs.FileInfo(file.Name, file.FullName));
				}
			}

			return listFiles;
		}
		////////////////////////////////////////////////////////////////////////////////////////////////////

		////////////////////////////////////////////////////////////////////////////////////////////////////
		//
		/// <summary>
		/// 去掉一个文件名的后缀
		/// 例如：“新建文件.txt”，去掉后缀，变成“新建文件”
		/// </summary>
		/// <param name="strFileName"></param>
		/// <returns></returns>
		public static string RemoveExtension(string strFileName)
		{
			int nPos = 0;

			nPos = strFileName.IndexOf(".");
			return strFileName.Substring(0, nPos);
		}
		////////////////////////////////////////////////////////////////////////////////////////////////////

		/// <summary>
		/// 获得一个文件的后缀
		/// </summary>
		/// <param name="strFileName"></param>
		/// <returns></returns>
		public static string GetFileExtension(string strFileName)
		{
			int nStartPos = 0;
			int nLength = 0;

			nStartPos = strFileName.IndexOf(".");
			nLength = strFileName.Length - nStartPos - 1;

			return strFileName.Substring(nStartPos + 1, nLength).ToLower();
		}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		//
		/// <summary>
		/// 根据等级，给名称添加错位符号，例如：一个二级单位，要在二级单位名称前添加一个错位符号，三级单位添加两个
		/// 错位符号。
		/// </summary>
		/// <param name="strName">要操作的名称</param>
		/// <param name="nGrade">等级</param>
		/// <param name="strFirstMask">第一个错位符号，不会等级增加后，第一个错位符号不会增加，只显示一个第一个错位符号</param>
		/// <param name="strGradeMark">可叠加的错位符号</param>
		/// <param name="nFirstGrade">开始的等级，一般为1</param>
		/// <returns></returns>
		public static string AddGradeBeforeName(string strName, int nFirstGrade, int nGrade, string strFirstMask, string strGradeMark)
		{
			string strReturn = "";

			for (int i = nFirstGrade; i < nGrade; i++)
			{
				strReturn = strReturn + strGradeMark;
			}

			if (nGrade > nFirstGrade)
			{
				strReturn = strFirstMask + strReturn;
			}

			return strReturn;
		}
		////////////////////////////////////////////////////////////////////////////////////////////////////

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>
		/// 获得指定日期所在月份的第一天的日期
		/// 例如：2014-3-25，则函数会得到日期，2014-3-1
		/// </summary>
		/// <returns></returns>
		public static string GetMonthFirstDate(string strNowDate)
		{
			DateTime dtNowDate = new DateTime();
			string strReturn = "";

			dtNowDate = Convert.ToDateTime(strNowDate);

			strReturn = dtNowDate.Year.ToString() + "-" + dtNowDate.Month.ToString() + "-" + "1";

			return strReturn;
		}
		////////////////////////////////////////////////////////////////////////////////////////////////////

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>
		/// 获得指定日期所在月份的最后一天的日期
		/// 例如：2014-3-25，则函数会得到日期：2014-3-31
		/// </summary>
		/// <param name="strNowDate"></param>
		/// <returns></returns>
		public static string GetMonthLastDate(string strNowDate)
		{
			DateTime dtNowDate = new DateTime();
			string strTemp = "";
			string strReturn = "";

			dtNowDate = Convert.ToDateTime(strNowDate);
			dtNowDate = dtNowDate.AddMonths(1);

			strTemp = dtNowDate.Year.ToString() + "-" + dtNowDate.Month.ToString() + "-" + "1";
			dtNowDate = Convert.ToDateTime(strTemp);
			dtNowDate = dtNowDate.AddDays(-1);

			strReturn = dtNowDate.Year.ToString() + "-" + dtNowDate.Month.ToString() + "-" + dtNowDate.Day.ToString();

			return strReturn;
		}
		////////////////////////////////////////////////////////////////////////////////////////////////////

		/// <summary>
		/// 把日期转换成中国常用的格式。例如：2011-1-1则转换成2011年1月1日
		/// </summary>
		/// <param name="strDate"></param>
		/// <returns></returns>
		public static string ConvertDateFormatToChina(string strDate)
		{
			System.DateTime dtDate = new DateTime();
			int nYear = 0;
			int nMonth = 0;
			int nDay = 0;
			string strReturn = "";

			dtDate = Convert.ToDateTime(strDate);

			nYear = dtDate.Year;
			nMonth = dtDate.Month;
			nDay = dtDate.Day;

			strReturn = nYear.ToString() + "年" + nMonth.ToString() + "月" + nDay.ToString() + "日";

			return strReturn;
		}

		/// <summary>
		/// 格式日期格式，输出的日期格式为：2011-01-01
		/// </summary>
		/// <![CDATA[2014-8-20 18:10:27]]>
		/// <param name="strDate">日期</param>
		/// <returns>格式化好的日期</returns>
		public static string FormatDate(string strDate, System.Web.UI.Page page)
		{
			System.DateTime dtDate = new DateTime();
			int nYear = 0;
			int nMonth = 0;
			int nDay = 0;
			string strMonth = "";
			string strDay = "";
			string strReturn;

			try
			{
				dtDate = Convert.ToDateTime(strDate);
				nYear = dtDate.Year;
				nMonth = dtDate.Month;
				nDay = dtDate.Day;

				if (nMonth < 10)
				{
					strMonth = "0" + nMonth.ToString();
				}
				else
				{
					strMonth = nMonth.ToString();
				}
				if (nDay < 10)
				{
					strDay = "0" + nDay.ToString();
				}
				else
				{
					strDay = nDay.ToString();
				}

				strReturn = nYear.ToString() + "-" + strMonth + "-" + strDay;

				return strReturn;
			}
			catch
			{
				TonyNet4V1.ShowMessageAlert.ShowMessage(page, "输入日期格式错");

				return "2010-01-01";
			}
		}

		#region 把用FileUpload控件上传的文件保存到服务器
		/// <summary>
		/// 把用FileUpload控件上传的文件保存到服务器
		/// </summary>
		/// <param name="fUpload">FileUpload控件</param>
		/// <param name="strPath">文件要保存到的路径，格式：~/ImportExcel/</param>
		/// <returns>上传文件保存到服务器上的相对路径</returns>
		public static string UploadFileToServer(System.Web.UI.WebControls.FileUpload fUpload, string strPath)
		{
			string strFolder = "";
			string strFile = "";
			FileInfo fInfo = new FileInfo(fUpload.FileName);

			strFolder = strPath + GetNowYearMonth();


			if (!Directory.Exists(System.Web.HttpContext.Current.Server.MapPath(strFolder)))
			{
				Directory.CreateDirectory(System.Web.HttpContext.Current.Server.MapPath(strFolder));
			}

			strFile = strFolder + "/" + GetNowDateTime() + fInfo.Extension;

			fUpload.SaveAs(System.Web.HttpContext.Current.Server.MapPath(strFile));

			return strFile;
		}
		#endregion 把用FileUpload控件上传的文件保存到服务器
	}
}